/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.chframework.monitor.task;

import cn.hutool.json.JSONUtil;
import com.chframework.monitor.MonitorResult;
import com.chframework.monitor.event.ServerMonitorEvent;
import com.chframework.common.context.BeanLifecycle;
import com.chframework.common.context.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;

import java.util.Objects;

/**
 * 服务器资源使用概况汇总任务
 */
@Slf4j
public class MonitorTask extends BeanLifecycle implements Runnable {

    private Boolean enable = true;
    private Boolean isExecuteComplete = true;
    private ApplicationContext applicationContext;

    @Override
    protected void initMethod() {
        this.applicationContext = SpringContextHolder.getApplicationContext();
    }

    /**
     * 停止任务
     */
    public void stopTask() {
        enable = false;
    }

    /**
     * 任务是否处于停止状态
     */
    public Boolean hasStop() {
        return !enable;
    }

    /**
     * 任务是否已经完成
     */
    public Boolean hasTaskComplete() {
        return isExecuteComplete;
    }

    @Override
    public void run() {
        if (enable) {
            try {
                isExecuteComplete = false;
                MonitorResult result = new MonitorResult();
                if (Objects.nonNull(this.applicationContext)) {
                    this.applicationContext.publishEvent(new ServerMonitorEvent(this, result));
                }

                log.info("监听探针 --->> 服务器资源使用概况汇总任务执行中...");
                log.info("JVM使用概况: {}", JSONUtil.toJsonStr(result.getJvm()));
                log.info("CPU使用概况: {}", JSONUtil.toJsonStr(result.getCpu()));
                log.info("内存使用概况: {}", JSONUtil.toJsonStr(result.getMem()));
                log.info("服务信息说明: {}", JSONUtil.toJsonStr(result.getSys()));
                log.info("磁盘使用概况: {}", JSONUtil.toJsonStr(result.getSysFiles()));
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                this.stopTask();
            } finally {
                isExecuteComplete = true;
            }
        }
    }

}
